package main;
import java.util.List;
import java.util.Scanner;

import org.hibernate.Transaction;
import org.omg.CORBA.UserException;

import dao.ContatoDAO;
import dao.MunicipioDAO;
import dao.TelefoneDAO;

import modelo.Contato;
import modelo.Estado;
import modelo.Municipio;
import modelo.Telefone;

import sun.swing.PrintingStatus;
import utils.PopulaBD;
import utils.SessionFactory;
import utils.UserSession;

public class Main {

	static UserSession userSession;

	public static String readLn() {
		Scanner sc = new Scanner(System.in);
		return sc.nextLine();
	}

	public static Integer readInt() {
		Scanner sc = new Scanner(System.in);
		Integer i = 0;
		try {
			i = sc.nextInt();
		} catch (RuntimeException e) {
			System.out.println("Opcao invalida");
		}

		return i;
	}

	public static void main(String[] args) {
		System.out.println("Olá! Bem-vindo ao NewSystemGeneration:");
		System.out.println("Digite seu login:");
		String login = readLn();
		System.out.println("Digite sua senha:");
		String senha = readLn();

		System.out.println("Login efetuado com SUCESSO.");
		userSession = new UserSession(login);

		int op, op2;

		do {
			op = menuInicial();
			switch (op) {
			// gera bd
			case 1:

				try {
						SessionFactory.createSchema(false, true);
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				break;
			// estados
			case 2:
				listarEstado();
				break;
			// municipios

			case 3:
				do {
					op2 = municipio(menu2("Municipio"));
				} while (op2 != 0);
				break;

			case 4:
				do {
					op2 = contato(menu2("Contatos"));
				} while (op2 != 0);
				break;
			case 0:
				System.out.println("Sair");
				break;
			default:
				System.out.println("nada");
			}

		} while (op != 0);

	}

	public static int menu2(String nome) {

		System.out.println("-----Menu de " + nome + "----");
		System.out.println(" 1  - Inserir");
		System.out.println(" 2  - Listar");
		System.out.println(" 3  - Editar");
		System.out.println(" 4  - Remover");
		System.out.println(" 0  - Sair");
		System.out.println("--------------------------");
		System.out.println();
		System.out.print("Op: ");
		int op = readInt();
		return op;

	}

	public static int municipio(int op) {

		switch (op) {
		// Inserir
		case 1:
			inserirMunicipio();
			break;
		// Listar
		case 2:
			listarMunicipio();
			break;
		// Editar
		case 3:
			editarMunicipio();
			break;
		// Remover
		case 4:
			removerMunicipio();
			break;
		case 0:
			break;
		default:

		}
		return op;
	}

	private static void removerMunicipio() {
		Transaction transaction = userSession.getHibSession()
				.beginTransaction();

		System.out.println("Municipios");

		try {

			listarMunicipio();

			System.out.println();
			System.out.print("selecione o id: ");

			Municipio m3 = MunicipioDAO.obtem(readInt(), userSession
					.getHibSession());
			MunicipioDAO.remove(m3, userSession.getHibSession());

		} catch (Exception e) {
			System.out.println("Não há Municipios cadastrados");
			e.printStackTrace();
		}

		transaction.commit();
		System.out.println();
		System.out.println("Removido com Sussa...");
		System.out.println();
	}

	private static void editarMunicipio() {
		Transaction transaction = userSession.getHibSession()
				.beginTransaction();

		System.out.println("Municipios");
		Municipio m = new Municipio();
		try {
			listarMunicipio();

			System.out.println();
			System.out.print("selecione o id: ");

			m = MunicipioDAO.obtem(readInt(), userSession.getHibSession());

		} catch (Exception e) {
			System.out.println("Não há Municipios cadastrados");
			e.printStackTrace();
		}

		System.out.println("Nome do Municipio: ");
		m.setNome(readLn());

		listarEstado();

		System.out.print("escolha pelo id: ");
		int op3 = readInt();

		for (Estado es : Estado.values()) {
			if (es.ordinal() == op3) {
				m.setEstado(es);
				System.out.println(m.getEstado().name());
				break;
			}
		}

		try {
			MunicipioDAO.atualiza(m, userSession.getHibSession());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		transaction.commit();
		
		System.out.println();
		System.out.println("Editado com Sussa...");
		System.out.println();
		
	}

	private static void listarMunicipio() {

		List<Municipio> municipios = null;
		try {
			municipios = MunicipioDAO.listar("", userSession.getHibSession());
			for (Municipio mu : municipios) {
				System.out.println(mu.getId() + " - " + mu.getNome() + " - "
						+ mu.getEstado().getNome() + " - Total: "
						+ mu.getTotalContatos() + " Cadastro");
			}

		} catch (Exception e) {
			System.out.println("Não há Municipios cadastrados");
			e.printStackTrace();
		}
		System.out.println();
		System.out.println();

	}

	private static void inserirMunicipio() {
		Transaction trannsaction = userSession.getHibSession()
				.beginTransaction();

		Municipio m = new Municipio();

		System.out.println("Nome do Municipio: ");

		m.setNome(readLn());

		listarEstado();

		System.out.print("escolha pelo id: ");
		int op3 = readInt();

		for (Estado es : Estado.values()) {
			if (es.ordinal() == op3) {
				m.setEstado(es);
				System.out.println(m.getEstado().name());
				break;
			}
		}

		System.out.println(m.toString());

		try {
			MunicipioDAO.adiciona(m, userSession.getHibSession());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		trannsaction.commit();
		userSession.getHibSession().flush();
		System.out.println();
		System.out.println("Inserido com Sussa...");
		System.out.println();

	}

	private static void listarEstado() {
		System.out.println("Estado: ");

		System.out.println("Id     Nome     Sigla");
		for (Estado es : Estado.values()) {
			System.out.println(es.ordinal() + " - " + es.getNome() + " - "
					+ es.name());
		}
		
	}

	public static int contato(int op) {

		switch (op) {
		// Inserir
		case 1:
			iserirContato();
			break;
		// Listar
		case 2:
			listarContatos();

			break;
		// Editar
		case 3:
			editarContatos();
			break;
		// Remover
		case 4:
			removerContato();
			break;
		case 0:
			break;
		default:

		}
		return op;

	}

	private static void removerContato() {
		Transaction transaction = userSession.getHibSession()
				.beginTransaction();

		System.out.println("Contatos");
		try {
			listarContatos();

			System.out.println("Escolha o id");

			Long id = (long) readInt();

			Contato contato = ContatoDAO.obtem(id, userSession.getHibSession());
			ContatoDAO.remove(contato, userSession.getHibSession());

		} catch (Exception e) {
			System.out.println("Não há Municipios cadastrados");
			e.printStackTrace();
		}
		transaction.commit();
		System.out.println();
		System.out.println("Removido com Sussa...");
		System.out.println();

	}

	private static void editarContatos() {
		Transaction transaction = userSession.getHibSession()
				.beginTransaction();
		Contato c = null;
		System.out.println("Contatos");

		try {
			listarContatos();

			System.out.println("Escolha o contato: ");
			Long id = (long) readInt();
			c = ContatoDAO.obtem(id, userSession.getHibSession());

		} catch (Exception e) {
			System.out.println("Não há Municipios cadastrados");
			e.printStackTrace();
		}

		System.out.println("Nome do Contato: ");
		c.setNome(readLn());

		System.out.println("Municipio: ");

		try {
			listarMunicipio();
			System.out.println("Escolha o id");

			Long id = (long) readInt();
			Municipio municipio = MunicipioDAO.obtem(id, userSession
					.getHibSession());
			c.setMunicipio(municipio);

		} catch (Exception e) {
			// TODO: handle exception
		}

		System.out.println("Telefone");
		Telefone telefone = null;
		String sn;
		do {
			telefone = new Telefone();

			System.out.println("DDD: ");
			telefone.setDdd(readLn());

			System.out.println("Numero:");
			telefone.setNumero(readLn());

			c.getTelefones().add(telefone);

			System.out.print("Mais telefone(s/n");
			sn = readLn();

		} while (sn.equals("s"));

		try {
			ContatoDAO.atualiza(c, userSession.getHibSession());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		transaction.commit();
		
		System.out.println();
		System.out.println("Editado com Sussa...");
		System.out.println();

	}

	private static void listarContatos() {
		List<Contato> contatos = null;
		try {
			contatos = ContatoDAO.listar("", userSession.getHibSession());
			for (Contato co : contatos) {
				System.out.println(co.getId() + " - " + co.getNome() + " - "
						+ co.getMunicipio());
			}

		} catch (Exception e) {
			System.out.println("Não há Municipios cadastrados");
			e.printStackTrace();
		}

	}

	private static void iserirContato() {
		Transaction transaction = userSession.getHibSession()
				.beginTransaction();
		Contato c = new Contato();

		System.out.println("Nome do Contato: ");
		c.setNome(readLn());

		System.out.println("Municipio: ");

		System.out.println("Id     Nome     Sigla");

		try {
			listarMunicipio();
			System.out.println("Escolha o id");

			Long id = (long) readInt();

			Municipio municipio = MunicipioDAO.obtem(id, userSession
					.getHibSession());
			c.setMunicipio(municipio);

		} catch (Exception e) {
			// TODO: handle exception
		}

		System.out.println("Telefone");
		Telefone telefone = null;
		String sn;
		do {
			telefone = new Telefone();

			System.out.println("DDD: ");
			telefone.setDdd(readLn());

			System.out.println("Numero:");
			telefone.setNumero(readLn());

			c.getTelefones().add(telefone);
			
			
			System.out.print("Mais telefone(s/n)? ");
			sn = readLn();

		} while (sn.equals("s"));

		try {
			ContatoDAO.adiciona(c, userSession.getHibSession());
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		transaction.commit();
		System.out.println();
		System.out.println("Inserido com Sussa...");
		System.out.println();

	}

	public static Integer menuInicial() {
		System.out.println("-------Menu Principal------");
		System.out.println(" 1  - Criar Banco");
		System.out.println(" 2  - Estados");
		System.out.println(" 3  - Municipio");
		System.out.println(" 4  - Contato");
		System.out.println(" 0  - Sair");
		System.out.println("----------------------------");
		System.out.println();
		System.out.print("Op: ");
		int op = readInt();
		return op;
	}

}
